#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

/*
(row,col)
对于 board 上值为 0 的位置
在棋盘为 board 的情况下，检查 row,col 这个位置上，value (1-9) 是否可行。
isValidAtPosition(1, 0, 2, sudoku)
isValidAtPosition(2, 0, 2, sudoku)
*/
bool isValidAtPosition(int value, int row, int col, vector<vector<int>> &board) {
  // 1. value 是否在 board 的第 row 行上
  bool rowIsValid = find(board[row].begin(), board[row].end(), value) == board[row].end(); // board[row] 没有 value, 通过了行检查

  // 2. value 是否在 col 上
  bool colIsValid = true;
  for (vector<int> v : board) {
    if (v[col] == value) {
      // 无法通过列检查
      colIsValid = false;
      break;
    }
  }

  if (!rowIsValid || !colIsValid) { return false; }

  // 3. value 是否在属于它自己的小九宫格上
  // 只有通过了行列检查之后，才需要检查九宫格
  int rowStart = row / 3 * 3;
  int colStart = col / 3 * 3;

  bool isGridValid = true;
  for (int r = rowStart; r <= rowStart + 2; ++r) {
    for (int c = colStart; c <= colStart + 2; ++c) {
      if (board[r][c] == value) {
        return false;
      }
    }
  }

  // 当上面这 3 个条件都为 false 的时候，就可以在 row,col 的位置，放置 value
  return true;
}

int main(int argc, char const *argv[])
{
  /* code */
  vector<vector<int>> sudoku {
    {5, 3, 0, 0, 7, 0, 0, 0, 0},
    {6, 0, 0, 1, 9, 5, 0, 0, 0},
    {0, 9, 8, 0, 0, 0, 0, 6, 0},
    {8, 0, 0, 0, 6, 0, 0, 0, 3},
    {4, 0, 0, 8, 0, 3, 0, 0, 1},
    {7, 0, 0, 0, 2, 0, 0, 0, 6},
    {0, 6, 0, 0, 0, 0, 2, 8, 0},
    {0, 0, 0, 4, 1, 9, 0, 0, 5},
    {0, 0, 0, 0, 8, 0, 0, 7, 9}
  };

  return 0;
}
